Completed
Branch future (3a58b6)
by Xaver
34s
created

router.js ➔ ... ➔ getLang   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
nc 2
dl 0
loc 8
rs 9.4285
nop 0
1
define(['Navigo'], function (Navigo) {
2
  'use strict';
3
4
  return function (language) {
5
    var init = false;
6
    var objects = { nodes: {}, links: {}, gateways: {} };
7
    var targets = [];
8
    var views = {};
9
    var current = {};
10
    var state = { lang: language.getLocale(), view: 'map' };
11
12
    function resetView() {
13
      targets.forEach(function (t) {
14
        t.resetView();
15
      });
16
    }
17
18
    function gotoNode(d) {
19
      if (d.nodeId in objects.nodes) {
20
        targets.forEach(function (t) {
21
          t.gotoNode(objects.nodes[d.nodeId], objects.gateways);
22
        });
23
      }
24
    }
25
26
    function gotoLink(d) {
27
      if (d.linkId in objects.links) {
28
        targets.forEach(function (t) {
29
          t.gotoLink(objects.links[d.linkId]);
30
        });
31
      }
32
    }
33
34
    function view(d) {
35
      if (d.view in views) {
36
        views[d.view]();
37
        state.view = d.view;
38
        resetView();
39
      }
40
    }
41
42
    function customRoute(lang, viewValue, node, link, zoom, lat, lng) {
43
      current = {
44
        lang: lang,
45
        view: viewValue,
46
        node: node,
47
        link: link,
48
        zoom: zoom,
49
        lat: lat,
50
        lng: lng
51
      };
52
53
      if (lang && lang !== state.lang && lang === language.getLocale(lang)) {
54
        language.setLocale(lang);
55
      }
56
57
      if (!init || viewValue && viewValue !== state.view) {
58
        if (!viewValue) {
59
          viewValue = state.view;
60
        }
61
        view({ view: viewValue });
62
        init = true;
63
      }
64
65
      if (node) {
66
        gotoNode({ nodeId: node });
67
      } else if (link) {
68
        gotoLink({ linkId: link });
69
      } else if (lat) {
70
        targets.forEach(function (t) {
71
          t.gotoLocation({
72
            zoom: parseInt(zoom, 10),
73
            lat: parseFloat(lat),
74
            lng: parseFloat(lng)
75
          });
76
        });
77
      } else {
78
        resetView();
79
      }
80
    }
81
82
    var router = new Navigo(null, true);
83
84
    router
85
      .on(/^\/?#?\/([\w]{2})?\/?(map|graph)?\/?([a-f\d]{12})?([a-f\d\-]{25})?\/?(?:(\d+)\/([\d.]+)\/([\d.]+))?$/, customRoute)
86
      .on({
87
        '*': function () {
88
          router.fullUrl();
89
        }
90
      });
91
92
    router.generateLink = function generateLink(data, full, deep) {
93
      var result = '#';
94
95
      if (full) {
96
        data = Object.assign({}, state, data);
97
      } else if (deep) {
98
        data = Object.assign({}, current, data);
99
      }
100
101
      for (var key in data) {
102
        if (!data.hasOwnProperty(key) || data[key] === undefined) {
103
          continue;
104
        }
105
        result += '/' + data[key];
106
      }
107
108
      return result;
109
    };
110
111
    router.fullUrl = function fullUrl(data, e, deep) {
112
      if (e) {
113
        e.preventDefault();
114
      }
115
      router.navigate(router.generateLink(data, !deep, deep));
116
    };
117
118
    router.getLang = function getLang() {
119
      var lang = location.hash.match(/^\/?#\/([\w]{2})\//);
120
      if (lang) {
121
        state.lang = language.getLocale(lang[1]);
122
        return lang[1];
123
      }
124
      return null;
125
    };
126
127
    router.addTarget = function addTarget(d) {
128
      targets.push(d);
129
    };
130
131
    router.removeTarget = function removeTarget(d) {
132
      targets = targets.filter(function (e) {
133
        return d !== e;
134
      });
135
    };
136
137
    router.addView = function addView(k, d) {
138
      views[k] = d;
139
    };
140
141
    router.setData = function setData(data) {
142
      objects.nodes = {};
143
      objects.links = {};
144
      objects.gateways = data.gateways;
145
146
      data.nodes.all.forEach(function (d) {
147
        objects.nodes[d.node_id] = d;
148
      });
149
150
      data.links.forEach(function (d) {
151
        objects.links[d.id] = d;
152
      });
153
    };
154
155
    return router;
156
  };
157
});
158